package com.example.demozy.service;

import com.example.demozy.entity.Condition;
import com.example.demozy.entity.ConditionSheet;
import com.example.demozy.entity.SheetCondition;
import com.example.demozy.mapper.ConditionSheetMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author 张展鹏
 */
@Service
public class ConditionSheetService {
    // **************** 公开变量

    // **************** 私有变量

    @Autowired
    private ConditionSheetMapper conditionSheetMapper;

    // **************** 继承方法

    // **************** 公开方法

    /**
     * 显示条件单库，获取用户所有的条件单
     *
     * @param userId : 用户ID
     */
    public List<ConditionSheet> listAllConditionSheets(String userId) {
        return conditionSheetMapper.listAllConditionSheets(userId);
    }

    /**
     * 获取用户所有的条件单，从订单库
     *
     * @param userId : 用户ID
     */
    public List<ConditionSheet> listAllOrderConditionSheets(@Param("userId") String userId){
        return conditionSheetMapper.listAllOrderConditionSheets(userId);
    }

    /**
     * 获得指定未上架的条件单的所有条件及其参数
     *
     * @param conditionSheetId : 条件单ID
     */
    public List<SheetCondition> listConditionSheetsConditions(String conditionSheetId) {
        return conditionSheetMapper.listConditionSheetsConditions(conditionSheetId);
    }

    /**
     * 获取condition_sheet表最新的condition_sheet_id
     */
    public int getMaxConditionSheetId() {
        return conditionSheetMapper.getMaxConditionSheetId();
    }

    /**
     * 插入条件单表，仅条件单
     *
     * @param conditionSheetId : 条件单ID
     * @param conditionSheetName : 条件单名称
     * @param authorId : 作者ID
     */
    public int insertConditionSheet(String conditionSheetId, String conditionSheetName, String authorId) {
        return conditionSheetMapper.insertConditionSheet(conditionSheetId, conditionSheetName, authorId);
    }

    /**
     * 插入条件单的条件
     *
     * @param conditionSheetId : 条件单ID
     * @param conditionId : 条件ID
     * @param conditionParameter : 条件参数
     * @param orderType : 买卖类型，0是买，1是卖。
     */
    public int insertSheetCondition(String conditionSheetId, String conditionId, String conditionParameter, int orderType) {
        return conditionSheetMapper.insertSheetCondition(conditionSheetId, conditionId, conditionParameter, orderType);
    }

    /**
     * 获取数据库中所有条件。
     */
    public List<Condition> listAllConditions() {
        return conditionSheetMapper.listAllConditions();
    }

    /**
     * 删除指定条件单
     *
     * @param conditionSheetId : 条件单ID
     */
    public int deleteConditionSheet(String conditionSheetId) {
        conditionSheetMapper.deleteSheetCondition(conditionSheetId);
        return conditionSheetMapper.deleteConditionSheet(conditionSheetId);
    }

    /**
     * 更新指定条件单的名称
     *
     * @param conditionSheetId : 条件单ID
     * @param conditionSheetName : 条件单名称
     */
    public int updateConditionSheetName(String conditionSheetId, String conditionSheetName) {
        return conditionSheetMapper.updateConditionSheetName(conditionSheetId, conditionSheetName);
    }

    /**
     * 更新指定条件单的条件
     *
     * @param conditionSheetId : 条件单ID
     * @param conditionId : 条件ID
     * @param conditionParameter : 条件参数
     * @param orderType : 买卖类型，0是买，1是卖。
     */
    public int updateCondition(String conditionSheetId, String conditionId, String conditionParameter, int orderType) {
        return conditionSheetMapper.updateCondition(conditionSheetId, conditionId, conditionParameter, orderType);
    }

    /**
     * 更新指定条件单的上架情况
     *
     * @param conditionSheetId : 条件单ID
     * @param onState : 上架情况，0是未上架，1是已上架，2是待审核，3是已购买
     */
    public int updateConditionSheetOnState(String conditionSheetId, int onState){
        return conditionSheetMapper.updateConditionSheetOnState(conditionSheetId, onState);
    }

    /**
     * 获取back_test表最新的back_test_report_id
     */
    public int getMaxReportId(){
        return conditionSheetMapper.getMaxReportId();
    }

    /**
     * 插入回测报告表。
     *
     * @param conditionSheetId : 条件单ID
     * @param backTestStock : 回测股票
     * @param startTime : 开始时间
     * @param endTime : 结束时间
     * @param yield : 收益率
     */
    public int saveBackTestReport(@Param("conditionSheetId") String conditionSheetId, @Param("backTestStock") String backTestStock
            , @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("yield") double yield){
        String backTestReportId = String.valueOf(conditionSheetMapper.getMaxReportId() + 1);
        return conditionSheetMapper.saveBackTestReport(backTestReportId, conditionSheetId, backTestStock, startTime, endTime, yield);
    }

    /**
     * 获取某指定条件单的上架状态
     *
     * @param conditionSheetId : 条件单ID
     */
    public int getConditionSheetOnState(@Param("conditionSheetId") String conditionSheetId){
        return conditionSheetMapper.getConditionSheetOnState(conditionSheetId);
    }

    /**
     * 从订单库中获取用户购买的条件单。
     *
     * @param userId : 用户ID
     */
    public List<ConditionSheet> listAllBuyConditionSheets(@Param("userId") String userId){
        return conditionSheetMapper.listAllBuyConditionSheets(userId);
    }

    // **************** 私有方法

}
